function mdlObjs = sortModelHierarchy(modelList)
%SORTMODELHIERARCHY 对模型列表进行层次结构排序
%   此函数分析模型引用关系，创建ModelHierarchy对象数组，并过滤掉非顶层模型，
%   返回只包含顶层模型的层次结构对象列表。
%
%语法:
%   mdlObjs = sortModelHierarchy(modelList)
%
%输入参数:
%   modelList - 字符串元胞数组，包含要分析的模型名称列表
%
%输出参数:
%   mdlObjs - ModelHierarchy对象元胞数组，仅包含顶层模型
%             每个对象包含完整的层次结构信息
%
%说明:
%   - 为每个模型创建ModelHierarchy对象（非递归模式）
%   - 通过递归分析设置hasParent标志来识别子模型
%   - 过滤掉所有具有父模型的子模型
%   - 最终只返回顶层模型的层次结构对象
%   - 清理基础工作空间中的临时变量
%
%层次结构分析过程:
%   1. 为每个模型创建ModelHierarchy对象
%   2. 在递归过程中标记所有子模型
%   3. 识别没有父模型的顶层模型
%   4. 移除所有子模型，保留顶层模型
%
%使用场景:
%   - GUI树结构显示
%   - 模型依赖关系分析
%   - 项目结构可视化
%   - 构建顺序确定
%
%示例:
%   % 获取模型列表并排序
%   models = getModelList();
%   topLevelModels = sortModelHierarchy(models);
%   
%   % 显示顶层模型信息
%   fprintf('找到 %d 个顶层模型:\n', length(topLevelModels));
%   for i = 1:length(topLevelModels)
%       fprintf('  %s\n', topLevelModels{i}.mdlName);
%       if ~isempty(topLevelModels{i}.Children)
%           fprintf('    子模型数量: %d\n', length(topLevelModels{i}.Children));
%       end
%   end
%
%工作空间变量:
%   函数在执行过程中会在基础工作空间创建hasParent结构体变量，
%   用于跟踪模型的父子关系，执行完毕后会自动清理。
%
%依赖项:
%   ModelHierarchy - 模型层次结构类
%   evalin - 在工作空间执行代码
%
%参见:
%   ModelHierarchy, getModelList, evalin
%

%版本: 1.0
%日期: 2024
%


mdlObjs = [];
for i = 1:numel(modelList)
    mdlName = modelList{i};
    Recursion = false;
    mdlObjs{i} = ModelHierarchy(mdlName,Recursion);
end

if evalin('base','exist(''hasParent'',''var'')')
    hasParent = evalin('base','hasParent');
    evalin('base','clear hasParent');
    i=1;
    while i <= numel(mdlObjs)
        mdlName = mdlObjs{i}.mdlName;
        if isfield(hasParent,mdlName) && hasParent.(mdlName)
            mdlObjs(i) = [];
        else
            i = i+1;
        end
    end
else
    % all models are top model, do nothing
end

end